home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / enigma / earcd / comm / comm5 / nwsbrkr5.lha / Reader / NewsBreaker / src / app / MainLoop.c < prev    next >
Text File  |  1996-12-16  |  11KB  |  544 lines

  1. /*
  2.  * MainLoop() -- Hauptschleife, bearbeitet IDCMP messages; ruft Fkt. auf.
  3.  *
  4.  * INPUTS
  5.  *   void
  6.  *
  7.  * RESULT
  8.  *   void
  9.  */
  10.  
  11. static void
  12. MainLoop (void)
  13. {
  14.   ULONG done = FALSE;        /* soll die Hauptschleife abgebrochen werden? */
  15.  
  16.   /* scanne Messagebase für Liste der Nachrichtengruppen */
  17.   if (!GetGroupList (account))
  18.     {
  19.       ShowError ("Zum Programmstart:\Gruppenliste wurde nicht erzeugt.");
  20.     }
  21.  
  22.   /* steige in Hauptschleife ein, Abbruch bedeutet Programmende */
  23.   /* todo/angedacht: Ereignisliste. Siehe <Actioncode.c> für Entwurf Struktur */
  24.  
  25.   while (!done)
  26.     {
  27.       /* Initialisiere actioncode-Variable über SETACTION-Makro: */
  28.       SETACTION (NO_ACTION);
  29.  
  30.       /* IntuiMessage auswerten */
  31.       while (msg = (struct IntuiMessage *) GetMsg ((struct MsgPort *) Mywindow->UserPort))
  32.     {
  33.       /* Message teilweise puffern */
  34.       myMsg.Class = msg->Class;
  35.       myMsg.Code = msg->Code;
  36.       myMsg.Seconds = msg->Seconds;
  37.       myMsg.Qualifier = msg->Qualifier;
  38.       myMsg.IAddress = msg->IAddress;
  39.  
  40.       printf ("\n>>>>>>>>>>>\n      Event: CLASS %lx CODE %x QUAL %x SECS %ld\n\n",
  41.           myMsg.Class, myMsg.Code, myMsg.Qualifier, myMsg.Seconds);
  42.  
  43.       /* auswerten */
  44.       if (myMsg.Class == IDCMP_CLOSEWINDOW)
  45.         {
  46.           SETACTION (QUIT_NEWSBREAKER);
  47.         }
  48.       else if ((myMsg.Class == IDCMP_VANILLAKEY) || (myMsg.Class == IDCMP_RAWKEY))    /* Vanillakey plus Rawkeys: neues Feature seit V36 */
  49.         {
  50.           switch (myMsg.Code)
  51.         {
  52.         case (0x09):    /* Tab Taste */
  53.           {
  54.             SETACTION (ACTIVATE_TAB_GADGET);
  55.             break;
  56.           }
  57.  
  58.         case CURSORRIGHT:
  59.         case ('+'):
  60.         case (' '):
  61.         case ('n'):
  62.         case (')'):
  63.         case ('>'):
  64.         case ('.'):
  65.           {
  66.             SETACTION (DISPLAY_NEXT_MESSAGE);
  67.             break;
  68.           }
  69.  
  70.         case CURSORLEFT:
  71.         case ('z'):
  72.         case ('-'):
  73.         case ('['):
  74.         case ('<'):
  75.         case ('('):
  76.           {
  77.             SETACTION (DISPLAY_PREV_MESSAGE);
  78.             break;
  79.           }
  80.  
  81.         case ('d'):    /* lösche Message */
  82.           {
  83.             SETACTION (DELETE_MESSAGE_SAFELY);    /* lösche aktuelle Message, mit Sicherheitsabfrage */
  84.             break;
  85.           }
  86.  
  87.         case CURSORDOWN:
  88.           {
  89.             SETACTION (SCROLL_DOWN_TEXTFIELD);
  90.             break;
  91.           }
  92.  
  93.         case CURSORUP:
  94.           {
  95.             SETACTION (SCROLL_UP_TEXTFIELD);
  96.             break;
  97.           }
  98.  
  99.         case ('q'):    /* Abbruch NewsBreaker: */
  100.           {
  101.             SETACTION (QUIT_NEWSBREAKER_SAFELY);
  102.             break;
  103.           }
  104.         }
  105.         }
  106.       else if (myMsg.Class == IDCMP_REFRESHWINDOW)
  107.         {
  108.           SETACTION (REFRESH_WINDOW)
  109.         }
  110.  
  111.       else if (myMsg.Class == IDCMP_IDCMPUPDATE)
  112.         {
  113.           printf ("IDCMP UPDATE --- obsolet\n");    /* todo: entfernen, austragen */
  114.         }
  115.  
  116.       else if (myMsg.Class == IDCMP_GADGETUP)
  117.         {
  118.           /* Ein Gadget wurde aktiviert. In dieser Routine wird
  119.              das UserData-Feld gelesen. In UserData steht Actioncode
  120.              Nummer der auszuführenden Funktion. */
  121.  
  122.           struct Gadget *g;
  123.           g = (struct Gadget *) myMsg.IAddress;
  124.           printf ("GADGETUP-Event: ID %ld\n", g->GadgetID);
  125.  
  126.           if (g->GadgetID == 20 || g->GadgetID == 40)    /* listview? */
  127.         {
  128.           printf ("Mainloop: Listview auslesen\n\n");
  129.           GetSelectedListEntry (g);
  130.           printf ("\nMainloop: auslesen Listview beendet\n\n\n");
  131.         }
  132.           else
  133.         {
  134.           if (g->UserData)    /* todo : Zugriff auf Userdata: ist das BOOPSI-Gadget konform? oder hack? */
  135.             {
  136.               SETACTION ((ULONG) (g->UserData));
  137.             }
  138.           else
  139.             {
  140.               ShowError ("Funktionsloses Gadget:\nGadget-UserData ist Null!");    /* Leeres UserData-Feld */
  141.             }
  142.         }
  143.         }
  144.  
  145.       else if (myMsg.Class == IDCMP_MENUPICK)
  146.         {
  147.           UWORD num = myMsg.Code;
  148.           while (num != MENUNULL)
  149.         {
  150.           /* Menu-Auswertung */
  151.           ULONG code = NULL;
  152.           struct MenuItem *item = NULL;
  153.  
  154.           item = ItemAddress (strip, num);    /* strip wurde in newsbreaker.c gebaut. */
  155.  
  156.           /* Inhalt des MenuItem-UserData-Feldes lesen. */
  157.           code = (ULONG) (GTMENUITEM_USERDATA (item));
  158.           if (code)
  159.             {
  160.               SETACTION (code);
  161.             }
  162.           else
  163.             {
  164.               ShowError ("Menupunkt ohne Funktion:\nMenu-UserData ist Null!");
  165.             }
  166.           num = item->NextSelect;    /* wurden weitere Menüpunkte gewählt? */
  167.         }
  168.           //ActivateGadget(txtfld, Mywindow, NULL);
  169.         }
  170.  
  171. /*------------------------------------------------------------*/
  172.       ReplyMsg ((struct Message *) msg);    /* Msg freigeben */
  173.  
  174.     }            /* Ende der IDCMP-Auswertung */
  175.  
  176. /*------------------------------------------------------------*/
  177.       /* hier entsprechende Routinen ausführen */
  178. /*------------------------------------------------------------*/
  179.  
  180.       switch (actioncode)
  181.  
  182.     {
  183.     case (NO_ACTION):
  184.       {
  185.         printf ("-- NO_ACTION --\n\n");
  186.         break;
  187.       }
  188.  
  189.     case (ACTIVATE_TAB_GADGET):
  190.       {
  191.         ActivateTabGadget (Mywindow);    /* erstes "Tab"-Gadget wird aktiviert */
  192.         break;
  193.       }
  194.  
  195.     case (DISPLAY_NEXT_MESSAGE):
  196.       {
  197.         if (tempNum = GetNextMsg (account, GlobMsgNum))
  198.           {
  199.         MarkListEntry (gad_message, NEXT_ENTRY);
  200.         DisplayMsg (txtfld, Mywindow, infobar_h, account, tempNum);
  201.           }
  202.         else
  203.           {
  204.         if (lasterror == actioncode)
  205.           {
  206.             ShowError ("Ende der Nachrichtenliste erreicht");
  207.           }
  208.         else
  209.           {
  210.             ErrorBeep ();
  211.             lasterror = actioncode;
  212.           }
  213.           }
  214.         break;
  215.       }
  216.  
  217.     case (DISPLAY_PREV_MESSAGE):
  218.       {
  219.         if (tempNum = GetPrevMsg (account, GlobMsgNum))
  220.           {
  221.         MarkListEntry (gad_message, PREV_ENTRY);
  222.         DisplayMsg (txtfld, Mywindow, infobar_h, account, tempNum);
  223.           }
  224.         else
  225.           {
  226.         if (lasterror == actioncode)
  227.           {
  228.             ShowError ("Anfang der Nachrichtenliste erreicht");
  229.           }
  230.         else
  231.           {
  232.             ErrorBeep ();
  233.             lasterror = actioncode;
  234.           }
  235.           }
  236.         break;
  237.       }
  238.  
  239.     case (DISPLAY_SELECTED_MESSAGE):    /* GetNewMsg() */
  240.       {
  241.         if (tempNum = GetNewMsg (account))
  242.           {
  243.         DisplayMsg (txtfld, Mywindow, infobar_h, account, tempNum);
  244.           }
  245.         break;
  246.       }
  247.  
  248.     case (SCROLL_DOWN_TEXTFIELD):
  249.       {
  250.         /* !!! todo: !!! */
  251.         ULONG currentline = 0;
  252.         ULONG totallines = 0;
  253.         ULONG visiblelines = 0;
  254.  
  255.         /* Spreche das BOOPSI-Textfield-Gadget an */
  256.         GetAttr (TEXTFIELD_Top, txtfld, ¤tline);
  257.         GetAttr (TEXTFIELD_Lines, txtfld, &totallines);
  258.  
  259.         /* Test auf LSHIFT oder RSHIFT */
  260.         if (myMsg.Qualifier == 0x0001)
  261.           {
  262.         printf ("Qualifier!\n");
  263.         GetAttr (TEXTFIELD_Visible, txtfld, &visiblelines);
  264.         if (totallines > currentline + visiblelines)
  265.           {
  266.             currentline = currentline + visiblelines;
  267.           }
  268.  
  269.           }
  270.         else
  271.           {
  272.         if (totallines > currentline)
  273.           {
  274.             currentline++;
  275.           }
  276.           }            /* else */
  277.  
  278.         /* Setze Zeile */
  279.         SetGadgetAttrsX (txtfld, Mywindow, NULL,
  280.                  TEXTFIELD_Top, currentline,
  281.                  TAG_END);
  282.         break;
  283.       }
  284.  
  285.     case (SCROLL_UP_TEXTFIELD):
  286.       {
  287.         ULONG currentline = 0;
  288.  
  289.         /* Spreche das BOOPSI-Textfield-Gadget an */
  290.         GetAttr (TEXTFIELD_Top, txtfld, ¤tline);
  291.  
  292.         if (currentline)
  293.           {
  294.         currentline--;
  295.  
  296.         /* Scrolle Textfeld um eine Zeile hoch */
  297.         SetGadgetAttrsX (txtfld, Mywindow, NULL,
  298.                  TEXTFIELD_Top, currentline,
  299.                  TAG_END);
  300.           }
  301.  
  302.         break;
  303.       }
  304.  
  305.     case (QUIT_NEWSBREAKER):
  306.       {
  307.         done = TRUE;
  308.         break;
  309.       }
  310.  
  311.     case (QUIT_NEWSBREAKER_SAFELY):
  312.       {
  313.         if (ShowReq (NULL, NB_NAME " jetzt verlassen?", "Verlassen|Zurück"))
  314.           {
  315.         done = TRUE;
  316.           }
  317.         break;
  318.       }
  319.  
  320.  
  321.     case (REFRESH_WINDOW):
  322.       {
  323.         /* RefreshWindow: todo: Gelegentlich Bugs beim Resizen!!! */
  324.         printf ("BeginRefresh %lx\n", Mywindow);    /* debug */
  325.  
  326.         BeginRefresh (Mywindow);    /* siehe Intuition Autodoc: Vorsicht! */
  327.         InfoBarUpdate (account, GlobMsgNum, Mywindow, infobar_h);    /* todo: nur simple gfx! */
  328.         EndRefresh (Mywindow, TRUE);
  329.  
  330.         printf ("Refresh ended\n");        /* debug */
  331.         break;
  332.       }
  333.  
  334.     case (GET_NEW_GROUP):
  335.       {
  336.         if (!GetGroupList (account))
  337.           {
  338.         ShowError ("GET_NEW_GROUP\nListe wurde nicht erzeugt.");
  339.           }
  340.         break;
  341.       }
  342.  
  343.     case (OPEN_AMIGAGUIDE):    /* ruft OpenDatatypeWindow() auf */
  344.       {
  345.         OpenAmigaGuide (Mywindow);    /* Online-Hilfe */
  346.         break;
  347.       }
  348.  
  349.     case (OPEN_ABOUT):    /* ruft OpenDatatypeWindow() auf */
  350.       {
  351.         OpenAbout (Mywindow);    /* Aboutfenster */
  352.         break;
  353.       }
  354.  
  355.     case (DISPLAY_HELP):
  356.       {
  357.         DisplayTxt (txtfld, Mywindow, help_text);
  358.         break;
  359.       }
  360.  
  361.     case (DISPLAY_BUGS):
  362.       {
  363.         DisplayTxt (txtfld, Mywindow, bugs_text);
  364.         break;
  365.       }
  366.     case (DISPLAY_BUGREPORT):
  367.       {
  368.         DisplayTxt (txtfld, Mywindow, bugreport_text);
  369.         break;
  370.       }
  371.  
  372.     case (DISPLAY_ORDERFORM):
  373.       {
  374.         DisplayTxt (txtfld, Mywindow, orderform_text);
  375.         break;
  376.       }
  377.  
  378.     case (DISPLAY_FEATUREWISH):
  379.       {
  380.         DisplayTxt (txtfld, Mywindow, featurewish_text);
  381.         break;
  382.       }
  383.  
  384.     case (CUT_TEXTFIELD):
  385.       {
  386.         TextfieldMethods (TEXTFIELD_Cut);
  387.         break;
  388.       }
  389.  
  390.     case (COPY_TEXTFIELD):
  391.       {
  392.         TextfieldMethods (TEXTFIELD_Copy);
  393.         break;
  394.       }
  395.  
  396.     case (COPYALL_TEXTFIELD):
  397.       {
  398.         TextfieldMethods (TEXTFIELD_CopyAll);
  399.         break;
  400.       }
  401.  
  402.     case (PASTE_TEXTFIELD):
  403.       {
  404.         TextfieldMethods (TEXTFIELD_Paste);
  405.         break;
  406.       }
  407.  
  408.     case (UNDO_TEXTFIELD):
  409.       {
  410.         TextfieldMethods (TEXTFIELD_Undo);
  411.         break;
  412.       }
  413.  
  414.     case (ERASE_TEXTFIELD):
  415.       {
  416.         TextfieldMethods (TEXTFIELD_Erase);
  417.         break;
  418.       }
  419.  
  420.     case (WRITE_REPLY_MESSAGE):
  421.       {
  422.         WriteMsg (REPLY);
  423.         break;
  424.       }
  425.  
  426.     case (WRITE_FOLLOWUP_MESSAGE):
  427.       {
  428.         WriteMsg (FOLLOWUP);
  429.         break;
  430.       }
  431.  
  432.     case (WRITE_EMAIL_MESSAGE):
  433.       {
  434.         WriteMsg (EMAIL);
  435.         break;
  436.       }
  437.  
  438.     case (WRITE_POSTING_MESSAGE):
  439.  
  440.       {
  441.         WriteMsg (POSTING);
  442.         break;
  443.       }
  444.  
  445.     case (GET_MAIL_GROUP):
  446.       {
  447.         if (AktMsgGroup)
  448.           {
  449.         free (AktMsgGroup);
  450.         AktMsgGroup = NULL;
  451.           }
  452.         AktMsgGroup = strdup ("");    /* Gruppe "" = Mailgruppe in UMS */
  453.         DisplayMsg (txtfld, Mywindow, infobar_h, account, GetNewMsg (account));
  454.         break;
  455.       }
  456.  
  457.     case (CATCHUP_CURRENT_GROUP):
  458.       {
  459.         int count = 0;
  460.         count = CatchUpCurrentGroup ();
  461.         printf (count ? "Catchup von %ld Messages\n" :
  462.             "Keine Messages für Catchup vorhanden\n", count);
  463.         ResetNBDisplay ();
  464.  
  465.         /* neue Grupenliste nach Catchup erzeugen: */
  466.         if (!GetGroupList (account))
  467.           {
  468.         ShowError ("Catchup:\neue Liste nicht erzeugt.");
  469.           }
  470.  
  471.         break;
  472.       }
  473.  
  474.     case (SET_FOCUS_ALL_MSG):
  475.       {
  476.         ResetNBDisplay ();
  477.         GlobalFocus = AlleMsg;
  478.         break;
  479.       }
  480.  
  481.     case (SET_FOCUS_NEW_MSG):
  482.       {
  483.         ResetNBDisplay ();
  484.         GlobalFocus = NeueMsg;
  485.         break;
  486.       }
  487.  
  488.     case (SET_FOCUS_LAST25_MSG):
  489.       {
  490.         ResetNBDisplay ();
  491.         GlobalFocus = 25;    /* Letzte25Msg; todo */
  492.         break;
  493.       }
  494.  
  495.     case (DEBUG_SHOWUMSFIELD):
  496.       {
  497.         ShowUMSField (account, GlobMsgNum);
  498.         break;
  499.       }
  500.  
  501.     case (DEBUG_SHOWGLOBALS):
  502.       {
  503.         ShowGlobals (SG_FULL);
  504.         break;
  505.       }
  506.  
  507.     case (DELETE_MESSAGE_SAFELY):    /* lösche aktuelle Message, mit Sicherheitsabfrage */
  508.     case (DELETE_MESSAGE):    /* lösche aktuelle Message, ohne Abfrage */
  509.       {
  510.         DeleteUMSMessage (account, GlobMsgNum);
  511.         break;
  512.       }
  513.  
  514.     case (SAVE_MESSAGE):    /* lösche aktuelle Message, ohne Abfrage */
  515.       {
  516.         SaveUMSMessage (account, GlobMsgNum);
  517.         break;
  518.       }
  519.  
  520.     case (PRINT_MESSAGE):    /* lösche aktuelle Message, ohne Abfrage */
  521.       {
  522.         PrintUMSMessage (account, GlobMsgNum);
  523.         break;
  524.       }
  525.  
  526.     default:
  527.       {
  528.         ShowError ("Funktionsloser Code.\nActioncode unbekannt!\n");
  529.         break;
  530.       }
  531.  
  532.     }            /* switch (actioncode) */
  533.  
  534.  
  535.       /* Ende Codeausführung */
  536. /*------------------------------------------------------------*/
  537.  
  538.       if (!done)
  539.     {
  540.       Wait (sigs);        /* schlafen, bis ein Signal aus sigs uns weckt */
  541.     }
  542.     }                /* while (!done) */
  543. }
  544.